<?php

/*
	info: 控制器基类
	base: Lfly, Template, WEB_CHARSET
	$Id: controllerbase.class.php 14 2011-08-29 08:48:19Z lfly1573@gmail.com $
*/

if (!defined('WEB_IN'))
{
	header("HTTP/1.0 404 Not Found");
	exit();
}

class ControllerBase
{
	/**
	 * @var Template
	 */
	protected $tpl = NULL;

	/**
	 * 构造函数
	 * @param $bolUseTpl 是否自动创建模板类
	 * @return void
	 */
	public function __construct($bolUseTpl = TRUE)
	{
		if ($bolUseTpl)
		{
			$this->CreateTplObj();
		}
	}


	/****************************************************************/


	/**
	 * 创建模板类
	 * @return void
	 */
	protected final function CreateTplObj()
	{
		if (!isset(Lfly::$webModel['Template']) || !is_object(Lfly::$webModel['Template']))
		{
			Lfly::$webModel['Template'] = new Template();
		}
		if (!is_object($this->tpl))
		{
			$this->tpl =& Lfly::$webModel['Template'];
		}
	}

	/**
	 * 格式化获取参数
	 * @param $mixVar 要格式化的参数 字符格式“变量名1[,变量名2...]” 数组格式“array(array('变量名', '类别'), '变量名')”
	 * @param $strType 没有进行类别设置的参数默认类别 可取值 str:字符串 int:整数 bol:真假(1和0表示) num:数字 ary:数组
	 * @param $bolDefault 对没有isset的变量是否初始化
	 * @return array 引用数组
	 */
	protected final function FormatRequestVar($mixVar, $strType = 'str', $bolDefault = TRUE)
	{
		$tempReturn = array();
		if (!is_array($mixVar))
		{
			$mixVar = explode(',', $mixVar);
		}
		foreach ($mixVar as $tempValue)
		{
			$tempValue = (array)$tempValue;
			if (!isset($tempValue[0]) || $tempValue[0]=='')
			{
				continue;
			}
			if (!isset($tempValue[1]))
			{
				$tempValue[1] = $strType;
			}
			if ($bolDefault || isset(Lfly::$webRequest[$tempValue[0]]))
			{
				Lfly::$webRequest[$tempValue[0]] = $this->GetRequestVar($tempValue[0], $tempValue[1]);
				$tempReturn[$tempValue[0]] =& Lfly::$webRequest[$tempValue[0]];
			}
		}
		return $tempReturn;
	}

	/**
	 * 开启页面缓存
	 * @param $bolGzip 是否启用gzip压缩
	 * @return void
	 */
	protected final function OpenBuffer($bolGzip = TRUE)
	{
		if ($bolGzip && function_exists('ob_gzhandler'))
		{
			ob_start('ob_gzhandler');
			Lfly::$webServer['bufferState'] = 1;
		}
		else
		{
			ob_start();
			Lfly::$webServer['bufferState'] = 0;
		}
	}

	/**
	 * 强制发送html头部格式
	 * @return void
	 */
	protected final function SendHtmlHeader()
	{
		header("Content-Type: text/html; charset=".WEB_CHARSET);
	}

	/**
	 * 强制发送xml头部格式
	 * @return void
	 */
	protected final function SendXmlHeader()
	{
		@header("Expires: -1");
		@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
		@header("Pragma: no-cache");
		header("Content-Type: text/xml; charset=".WEB_CHARSET);
	}

	/**
	 * 显示提示信息，执行后程序终止
	 * @param $mixShowMessage 提示信息，可以为字符串(语言包格式为“lang:语言标记[@@参数1@@参数2...]”)和数组
	 * @param $strUrlForward 要跳转的网址
	 * @param $strExtra 扩展控制(STOP:不自动跳转  BACK:返回)
	 * @param $$strFolder 模板所在文件夹名称，用于不同风格的提示信息显示
	 * @param $aryMoreLink 更多链接，格式array(array('链接说明', '链接地址')[,更多链接数组...])
	 * @return void
	 */
	protected final function ShowMessage($mixShowMessage, $strUrlForward = '', $strExtra = '', $strFolder = '', $aryMoreLink = array())
	{
		define('WEB_SHOW_MESSAGE', TRUE);
		!defined('WEB_NOT_COUNT') and define('WEB_NOT_COUNT', TRUE);
		$isAutoJump = FALSE;
		if ($strUrlForward!='' && $strExtra!='STOP')
		{
			$isAutoJump = TRUE;
			Lfly::$webGlobal['htmlHead'][] = '<meta http-equiv="refresh" content="3;url='.$strUrlForward.'" />';
		}
		if (is_string($mixShowMessage) && substr($mixShowMessage, 0, 5)=='lang:')
		{
			$mixShowMessage = Lfly::TranslateLanguage($mixShowMessage);
		}
		elseif (is_array($mixShowMessage))
		{
			foreach ($mixShowMessage as $tempkey => $tempvalue)
			{
				if (substr($tempvalue, 0, 5)=='lang:')
				{
					$mixShowMessage[$tempkey] = Lfly::TranslateLanguage($tempvalue);
				}
			}
		}
		if ($strFolder!='' && substr($strFolder, -1)!='/')
		{
			$strFolder .= '/';
		}
		$this->CreateTplObj();
		$this->tpl->Assign('mixShowMessage', $mixShowMessage);
		$this->tpl->Assign('strUrlForward', $strUrlForward);
		$this->tpl->Assign('strExtra', $strExtra);
		$this->tpl->Assign('aryMoreLink', $aryMoreLink);
		$this->tpl->Assign('isAutoJump', $isAutoJump);
		$this->tpl->Display($strFolder.'showmessage');
		exit();
	}

	/**
	 * 错误的转跳页面
	 * @param $intErrorType 错误类型
	 * @return void
	 */
	protected final function ShowErrorPage($intErrorType = 404)
	{
		!defined('WEB_NOT_COUNT') and define('WEB_NOT_COUNT', TRUE);
		if ($intErrorType == 404)
		{
			header("HTTP/1.0 404 Not Found");
			header("Status: 404 Not Found");
			Cache::LoadCacheSet('Class');
			Cache::LoadCacheData('class');
			$this->CreateTplObj();
			$this->tpl->Display('index/404');
			exit();
		}
	}


	/****************************************************************/


	/* 获取提交变量的值 */
	private function GetRequestVar($strVar, $strType = 'str')
	{
		$tempValue = isset(Lfly::$webRequest[$strVar]) ? Lfly::$webRequest[$strVar] : NULL;
		switch ($strType)
		{
			case 'int':
				$tempValue = !is_null($tempValue) ? intval($tempValue) : 0;
				break;
			case 'bol':
				$tempValue = (!is_null($tempValue) && intval($tempValue)>0) ? 1 : 0;
				break;
			case 'num':
				$tempValue = (is_numeric($tempValue) && (string)(float)$tempValue===(string)$tempValue) ? $tempValue : 0;
				break;
			case 'ary':
				$tempValue = (array)$tempValue;
				break;
			case 'str':
			default:
				$tempValue = (string)$tempValue;
		}
		return $tempValue;
	}

}	//end class

?>